#include <iostream>
#include <limits>

template <class T>
struct is_void
{
    static const bool value = false;
};

template <>
struct is_void<void>
{
    static const bool value = true;
};

template <class T>
struct is_point
{
    static const bool value = false;
};

template <class T>
struct is_point<T*>
{
    static const bool value = true;
};

int main(void)
{
    std::cout << is_void<double>::value << std::endl;
    std::cout << is_void<void>::value << std::endl;
    std::cout << is_point<int>::value << std::endl;
    std::cout << is_point<int*>::value << std::endl;
}
